A device in a network often needs to access a resource associated with another device in the network. Consider, for example, a Local Area Network (LAN) that includes a number of Personal Computers (PCs). Moreover, a first PC in the network needs to access a file that it does not currently have (e.g., a file that is not stored locally at the first PC). In this case, the PC may locate a second PC in the network that does have the file. The first PC can then ask the second PC to transmit the file to the first PC via the network.
To locate the second PC, the first PC can transmit a discovery request, including the file's name, to the other PCs in the network. Every PC in the network that has the file can then transmit a response to the first PC.
Such an approach, however, can have a number of disadvantages. For example, the first PC may receive a large number of responses to the discovery request. These responses can consume bandwidth in the network and take a considerable amount of time to process, especially in a large network (e.g., a network having a thousand PCs).
Similarly, a large number of discovery requests may be transmitted in the network. For example, hundreds of PCs may need to access a file that contains an updated virus definition list. All of these discovery requests, and associated responses, will also use bandwidth and processing time.
Moreover, more than one PC in the network may have the file. Each of those PCs, however, may not be equally suitable to transmit the file to the first PC. For example, one PC might have a fast processor that is not currently being used, while another PC has a slower processor that is being heavily used. Similarly, different PCs might have different maximum speeds at which information can be transmitted. In either case, the file may be accessed inefficiently.